package app.dis.presentacion.beans;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Stateful;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.jboss.logging.Logger;
import org.richfaces.json.JSONObject;




import com.google.gson.Gson;

import app.dis.accesoadatos.dao.CuentaDAO;
import app.dis.accesoadatos.dao.EntidadesFinancierasDAO;
import app.dis.accesoadatos.dao.TransaccionDAO;
import app.dis.accesoadatos.entidades.Cliente;
import app.dis.accesoadatos.entidades.Cuenta;
import app.dis.accesoadatos.entidades.EntidadesFinancieras;
import app.dis.accesoadatos.entidades.MovimientoPOJO;
import app.dis.accesoadatos.entidades.Transaccion;
import app.dis.resources.Reloj;

@ConversationScoped
@Named
@Stateful
public class TransaccionesBean {

	long idCliente;
	
	Transaccion transaccion;
	List<EntidadesFinancieras>entidadesFinacieras;
	Logger log = Logger.getLogger(this.getClass().getName());
	
	private List<Cuenta> cuentas;
	Cuenta cuenta;
	Cliente cliente;
	Reloj r=new Reloj();
	private String mensaje;
	private boolean mostrarMensaje=false;
	
	
	
	
	
	@Inject
	Conversation conversation;

	@Inject
	EntidadesFinancierasDAO entidadesFinacierasDAO; 
	
	@Inject
	CuentaDAO cuentaDAO;
	
	
	@Inject
	TransaccionDAO transaccionDAO;

	
	
	@PostConstruct
	public void init(){
		this.conversation.begin();
		entidadesFinacieras=entidadesFinacierasDAO.getEntidadesFinancieras();
		transaccion=new Transaccion();
	
	}
	
	
	
	public void RealizarTransacion(){
		log.info("SE VA A REALIZAR LA TRANSACCIO");
		log.info("SE VA A REALIZAR LA TRANSACCIO a"+ this.cuenta.getNumeroCuenta());
		this.transaccion.setFecha(r.getFechaActual());
		this.transaccion.setHora(r.getHoraActual());
		
		
		//consulta el saldo actual
		
		double saldoActual=cuentaDAO.Consultar(this.cuenta.getId());
		
		if (this.transaccion.getMontoTransferencia() <= saldoActual) {
			
			//inicia el webservice
			MovimientoPOJO movimientoPOJO=new MovimientoPOJO(); 
			 
			movimientoPOJO.setCedulaDestinatario(transaccion.getCedulaDestinatario());
			movimientoPOJO.setDescripcion(transaccion.getDescripcion());
			movimientoPOJO.setValorATransferir(transaccion.getMontoTransferencia());
			movimientoPOJO.setCuentaOrigen(this.cuenta.getNumeroCuenta());
			movimientoPOJO.setNumCuentaDestino(transaccion.getNumCuentaDestino());
			movimientoPOJO.setEntidadFinanciera(transaccion.getUnaEntidadFinan().getNombre());
			movimientoPOJO.setFecha(transaccion.getFecha());
			movimientoPOJO.setHora(transaccion.getHora());
			movimientoPOJO.setCorreoDestino(transaccion.getCorreoDestino());
			
			
		
			
			
			
			HttpClient httpclient = new DefaultHttpClient();
			Gson gson = new Gson();
			HttpPost post = new HttpPost(
					"http://localhost/BancoCentral/rest/bancocentral/insertarTransferencia");

			
			StringEntity se;
			try {
				
				
				se = new StringEntity(gson.toJson(movimientoPOJO));
			
				post.setEntity(se);
				post.setHeader("Content-type", "application/json");
				

				HttpResponse response = httpclient.execute(post);

				String respStr = EntityUtils.toString(response.getEntity());
				
				//fin envio
				
				

				JSONObject respJSON = new JSONObject(respStr);
				
				
					
				
				
				
				if(respJSON.getInt("codigo")==2){
					transaccion.setSaldoAnterior(saldoActual+"");
					transaccion.setUnaCuenta(this.cuenta);
					transaccion.setNmCuentaOrigen(this.cuenta.getNumeroCuenta());
					transaccion.setTipoTran("DEPOSITO");
					
					this.cuenta.setSaldoActual(saldoActual-transaccion.getMontoTransferencia());
					
					cuentaDAO.Actualiza(this.cuenta);
					
					transaccionDAO.insertar(transaccion);
					mostrarMensaje=true;
					mensaje="TRANSACCION REALIZADA CORRECTAMENTE ";
					
					
				}
				
				if(respJSON.getInt("codigo")==3){
					mostrarMensaje=true;
					mensaje="ERROR EN EL BANCO CENTRAL ";
				}
				
				if(respJSON.getInt("codigo")==4){
					mostrarMensaje=true;
					mensaje="ERROR EN LA ENTIDAD B ";
				}
				
				if(respJSON.getInt("codigo")==5){
					mostrarMensaje=true;
					mensaje="ERROR NO EXISTE LA CEUNTA ";
				}

			} catch (Exception ex) {
				log.info("ERROR AL ENVIAR "+ex.getMessage());
				mostrarMensaje=true;
				mensaje="ERROR NO SE PUDO ENVIAR AL BANCO CENTRAL";
				
			}
			
			//fin del webservice
				
			
			
		}else {
			
			mostrarMensaje=true;
			mensaje="NO TIENE EL SALDO SUFICIENTE PARA REALIZAR LA TRANSACCION ";
			

		}
			
		
		//this.transaccion.setSaldoAnterior(saldoAnterior);
		
		
	}
	
	public String Finalizar(){
		
		this.conversation.end();
		
	return "RealizarTransaccion.xhtml?faces-redirect=true";
	}
	

	public Transaccion getTransaccion() {
		return transaccion;
	}

	public void setTransaccion(Transaccion transaccion) {
		this.transaccion = transaccion;
	}

	public List<EntidadesFinancieras> getEntidadesFinacieras() {
		return entidadesFinacieras;
	}

	public void setEntidadesFinacieras(
			List<EntidadesFinancieras> entidadesFinacieras) {
		this.entidadesFinacieras = entidadesFinacieras;
	}

	public List<Cuenta> getCuentas() {
		return cuentas;
	}

	public void setCuentas(List<Cuenta> cuentas) {
		this.cuentas = cuentas;
	}

	public Cuenta getCuenta() {
		return cuenta;
	}

	public void setCuenta(Cuenta cuenta) {
		this.cuenta = cuenta;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
	
	public String getMensaje() {
		return mensaje;
	}

	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}

	public boolean isMostrarMensaje() {
		return mostrarMensaje;
	}

	public void setMostrarMensaje(boolean mostrarMensaje) {
		this.mostrarMensaje = mostrarMensaje;
	}

	public long getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(long idCliente) {
		
		this.cuentas=cuentaDAO.getConsultar(idCliente);
		this.idCliente = idCliente;
	}

	
	
	
	

}
